iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
自我挑戰組

Unity入門遊戲開發與實作系列 第 26 篇

【Day 26】經典 Flappy Birds 遊戲實作(四)計分和 GameOver 機制

  • 分享至 

  • xImage
  •  

昨天我們製作完了水管和地板的移動,以及隨機生成位置不同的水管。今天,我們要來製作計分機制還有 GameOver 的機制

創建 GameManager 腳本

關於這個遊戲所有計分、遊戲是否繼續等等的問題,我們創建一個 GameManager.cs 的腳本來負責這個事情,在場景中創建一個空物件(Create Empty),把 GameManager.cs 掛在 Component 中。

// GameManager.cs
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public int score = 0;

    public bool isGameOver = false;

    public void AddScore()
    {
        score++;
    }
    public void SetGameOver()
    {
        isGameOver = true;
    }
}

腳本很簡單,設置了兩個 public 變數,分別是玩家分數和是否結束遊戲的布林值,還建立了兩個函式供外部使用。

腳色的碰撞偵測

我們要偵測小鳥與水管之間的碰撞,用於停止遊戲。還要偵測小鳥與兩個水管之間的被設為 Trigger 的 Box Collider 碰撞,用於玩家加分。

  • 我們需要先把所有的水管都加上 Tag ,好讓程式偵測 Tag 就知道我們撞到了什麼
    https://ithelp.ithome.com.tw/upload/images/20241010/201693015WrqTXM7W4.png

    在 Prefab 中設定 Tubes 的標籤為 Tube

  • 在 Bird.cs 內加入碰撞偵測的程式碼
// Bird.cs
using UnityEngine;

public class Bird : MonoBehaviour
{
    [SerializeField] private Rigidbody rb;

    [SerializeField] private float jumpForce;

    [SerializeField] private Animator birdAnimator;

    [SerializeField] private GameManager gamemanager;

    private void FixedUpdate()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {

            rb.velocity = Vector3.up * jumpForce;

        }
        if (rb.velocity.y > 0)
        {
            birdAnimator.SetBool("isFly", true);
        }
        else
        {
            birdAnimator.SetBool("isFly", false);
        }
    }
    private void OnTriggerEnter(Collider colliderInfo)
    {
        if(colliderInfo.CompareTag("Tube"))
        {
            gamemanager.AddScore();
        }
    }
    private void OnCollisionEnter(Collision colliderInfo)
    {
        gamemanager.SetGameOver();
    }
}

最尾巴新增的 OnTriggerEnter 是拿來偵測是否與水管中間的 Trigger (觸發器)發生碰撞,我們偵測如果腳色發生碰撞的物件標籤是 Tube ,就呼叫加分函式。而 OnCollisionEnter 則是偵測如果與上下兩根水管發生碰撞就呼叫遊戲結束的函式。
https://ithelp.ithome.com.tw/upload/images/20241010/20169301St18GUJ5Lg.png

中間的是 Trigger(觸發器),只能使用 OnTriggerEnter() 進行偵測
上下兩個是 Collider (碰撞器),只能使用 OnCollisionEnter() 進行偵測

接下來一樣在 Bird.cs 中加入這一小段,用於檢測是否需要繼續遊戲

// Bird.cs
using UnityEngine;

public class Bird : MonoBehaviour
{
// ... //
    private void FixedUpdate()
    {
        if(FindObjectOfType<GameManager>().isGameOver) return;
        // ... //

如果 isGameOver 被設為 true 就 return ,下面的程式碼都不再會被執行到
同樣的程式我們也需要加到 Tube.cs, Floor.cs, TubeSpawner.cs 裡面。當遊戲停止時,這幾個腳本也要停止運作。
這樣我們在遊戲中碰到水管時,玩家將無法繼續操控小鳥向上飛,地板、和水管也會停止移動和生成。

今天製作了 GameOver 還有計算分數的機制。明天,我們要來加入一些 UI 介面和音效來讓遊戲玩起來更生動!


上一篇
【Day 25】經典 Flappy Birds 遊戲實作(三)水管隨機生成和場景移動
下一篇
【Day 27】經典 Flappy Birds 遊戲實作(五)getReady 跟分數的 UI 動畫和遊戲音效
系列文
Unity入門遊戲開發與實作 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言